﻿namespace Ulid;

/// <summary>
/// <see cref="IUlidRng"/> 接口的基类
/// </summary>
public abstract class BaseUlidRng : IUlidRng
{
    /// <summary>
    /// 生成的随机字节的默认数量
    /// </summary>
    protected internal const int RANDLEN = 10;

    /// <summary>
    /// 创建并返回随机字节数组
    /// </summary>
    /// <param name="dateTime">需要生成随机字节的时间；可以忽略该日期时间，但它能提供上下文信息</param>
    /// <returns>随机字节数组</returns>
    public abstract byte[] GetRandomBytes(DateTimeOffset dateTime);

    /// <inheritdoc/>
    public abstract void GetRandomBytes(Span<byte> buffer, DateTimeOffset dateTime);

    /// <summary>
    /// 当未指定 <see cref="IUlidRng"/> 时，返回所使用的默认 <see cref="IUlidRng"/>
    /// </summary>
    /// <remarks>
    /// 这个值引用了一个 <see cref="CSUlidRng"/>.
    /// </remarks>
    public static readonly IUlidRng DEFAULTRNG = new CSUlidRng();

    /// <summary>
    /// 创建并返回在密码学意义上安全的随机字节数组
    /// </summary>
    /// <param name="dateTime">需要生成随机字节的时间；可以忽略该日期时间，但它能提供上下文信息</param>
    /// <returns>随机字节数组</returns>
    byte[] IUlidRng.GetRandomBytes(DateTimeOffset dateTime)
        => GetRandomBytes(dateTime);
}
